<template>
  <div :class="{ node: true, 'node-error-state': showError }">
    <div :class="{ 'node-body': true, error: showError }" @click="selected">
      <div class="node-body-left" @click.stop="leftMove" v-if="level > 1">
        <el-icon><ArrowLeft /></el-icon>
      </div>
      <div class="node-body-main">
        <div class="node-body-main-header">
          <span class="title">
            <el-icon><Operation /></el-icon>
            <ellipsis class="name" hover-tip :content="config.name ? config.name : '并行任务' + level"/>
          </span>
          <span class="option">
            <el-tooltip effect="dark" content="复制分支" placement="top">
              <el-icon @click="copy"><CopyDocument /></el-icon>
            </el-tooltip>
            <el-icon @click.stop="delNode"><Close /></el-icon>
          </span>
        </div>
        <div class="node-body-main-content">
          <span>并行任务（同时进行）</span>
        </div>
      </div>
      <div class="node-body-right" @click.stop="rightMove" v-if="level < size">
        <el-icon><ArrowRight /></el-icon>
      </div>
      <div class="node-error" v-if="showError">
        <el-tooltip effect="dark" :content="errorInfo" placement="top-start">
          <el-icon><Warning /></el-icon>
        </el-tooltip>
      </div>
    </div>
    <div class="node-footer">
      <div class="btn">
        <insert-button @insertNode="insertNode"></insert-button>
      </div>
    </div>
  </div>
</template>

<script>
import InsertButton from '/@/views/setting/workflow/process/InsertButton.vue'
import { ArrowLeft, Operation, CopyDocument, Close, ArrowRight, Warning } from '@element-plus/icons-vue'
import { reactive, toRefs } from 'vue'
import { isNotEmpty } from '/@/utils/utils'
export default {
    name: 'ConcurrentNode',
    components: {
        InsertButton,
        ArrowLeft,
        Operation,
        CopyDocument,
        Close,
        ArrowRight,
        Warning
    },
    props: {
        config: {
            type: Object,
            default: () => {
                return {}
            },
        },
        level: {
            type: Number,
            default: 1,
        },
        //条件数
        size: {
            type: Number,
            default: 0,
        },
    },
    emits: ['selected', 'leftMove', 'copy', 'delNode', 'rightMove', 'insertNode'],
    setup(props, context) {
        const { config } = toRefs(props)
        const state = reactive({
            errorInfo: '',
            showError: false,
        })
        const validate = (err) => {
            try {
                state.showError =
                !config.value.children || !isNotEmpty(config.value.children.id)
                if (state.showError) {
                    err.push(`并行分支${config.value.name}下面无节点`)
                    this.errorInfo = '请添加业务节点'
                }
                return state.showError
            } catch (e) {
                return true
            }
        }
        const selected = () => {
            context.emit('selected')
        }
        const leftMove = () => {
            context.emit('leftMove')
        }
        const copy = () => {
            context.emit('copy')
        }
        const delNode = () => {
            context.emit('delNode')
        }
        const rightMove = () => {
            context.emit('rightMove')
        }
        const insertNode = (type) => {
            console.log(type)
            context.emit('insertNode', type)
        }
        return {
            ...toRefs(state),
            validate,
            selected,
            leftMove,
            copy,
            delNode,
            rightMove,
            insertNode
        }
    }
}
</script>

<style lang="scss" scoped>
.node-error-state {
  .node-body {
    box-shadow: 0px 0px 5px 0px #f56c6c !important;
  }
}
.node {
  padding: 30px 55px 0;
  width: 330px;
  .node-body {
    cursor: pointer;
    min-height: 80px;
    max-height: 120px;
    position: relative;
    border-radius: 5px;
    background-color: white;
    box-shadow: 0px 0px 5px 0px #d8d8d8;
    &:hover {
      .node-body-left,
      .node-body-right {
        :deep(.icon) {
          display: block !important;
        }
      }
      .node-body-main {
        .option {
          display: inline-block !important;
        }
      }
      box-shadow: 0px 0px 3px 0px var(--el-color-primary);
    }
    .node-body-left,
    .node-body-right {
      display: flex;
      align-items: center;
      position: absolute;
      height: 100%;
      :deep(.icon) {
        display: none;
      }
      &:hover {
        background-color: #ececec;
      }
    }
    .node-body-left {
      left: 0;
    }
    .node-body-right {
      right: 0;
    }
    .node-body-main {
      position: absolute;
      width: 188px;
      left: 17px;
      display: inline-block;

      .node-body-main-header {
        padding: 10px 0px 5px;
        font-size: xx-small;
        position: relative;
        .title {
          color: #718dff;
          .name {
            display: inline-block;
            height: 14px;
            width: 130px;
            margin-left: 2px;
          }
        }
        .option {
          position: absolute;
          right: 0;
          display: none;
          font-size: medium;
          :deep(.icon) {
            color: #888888;
            padding: 0 3px;
          }
        }
      }
      .node-body-main-content {
        padding: 6px;
        color: #656363;
        font-size: 14px;

        :deep(.icon) {
          position: absolute;
          top: 55%;
          right: 10px;
          font-size: medium;
        }
      }
    }
    .node-error {
      position: absolute;
      right: -40px;
      top: 20px;
      font-size: 25px;
      color: #f56c6c;
    }
  }

  .node-footer {
    position: relative;
    .btn {
      width: 100%;
      display: flex;
      height: 70px;
      padding: 20px 0 32px;
      justify-content: center;
    }
    :deep(.el-button) {
      height: 32px;
    }
    &::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: -1;
      margin: auto;
      width: 2px;
      height: 100%;
      background-color: #cacaca;
    }
  }
}
</style>